home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / SAT 2.3.7 / Demos / Demo ƒ / HeartQuest demo ƒ / ClutFade / fade2.c < prev    next >
Encoding:
Text File  |  1995-07-15  |  4.7 KB  |  192 lines  |  [TEXT/KAHL]

  1. /*
  2. Based on a demo by N. Jonas Englund.
  3.  
  4. Substantially improved and altered by Ingemar Ragnemalm 1994
  5.  
  6. - Better function naming, Mac-standard
  7. - Simplified (removed unnecessary checks)
  8. - Pascal library and interface
  9. - Fade to anything, not just black
  10. - Checks color table size
  11. - Checks for CQD
  12. - Works with both Think and MetroWerks.
  13. */
  14.  
  15.  
  16. //================================= INCLUDES ====================================
  17.  
  18. #include "fade.h"
  19.  
  20. //================================= FUNCTIONS ===================================
  21.  
  22. static void CopyCluts     (GDHandle);
  23. static void CalcFade     (short, FadeValues*, RGBColor fadeTo);
  24. static void FadeOut     (short, FadeValues, RGBColor fadeTo);
  25. static void FadeIn     (short, FadeValues, RGBColor fadeTo);
  26. static void BlackOut     (RGBColor fadeTo);
  27. static void RestoreClut(void);
  28.  
  29. //================================== GLOBALS ====================================
  30.  
  31. CTabHandle     gFade,            // 'clut' to alter with fading functions
  32.             gOrig;            // 'clut' to hold a copy of original
  33. Handle        gTempH;            //  temporary handle to copy 'clut'
  34.  
  35. short        gCtSize;
  36. short        gCtSeedSave;    // Must save and restore the seed!
  37.  
  38. /********************************** fade_screen *********************************/
  39. extern
  40. pascal void FadeScreen(short speed, Boolean fadeOut, RGBColor fadeTo)
  41. {
  42.     GDHandle     oldDev, hGD;
  43.     FadeValues    rgbs;
  44.     SysEnvRec    world;
  45.     
  46.     if (noErr != SysEnvirons(1, &world)) return;
  47.     if (!world.hasColorQD) return;
  48.     
  49.     oldDev = GetGDevice();
  50.     hGD = GetMainDevice();
  51.  
  52.     gCtSize = (*(*(*hGD)->gdPMap)->pmTable)->ctSize;    /* Yet another case where Pascal is a lot sipler.*/
  53.     if (gCtSize < 1) return; // Can't run if no CLUT!
  54.     if (gCtSize > kMaxByte) return; // We don't expect that big CLUTs!
  55.  
  56.     SetGDevice(hGD);
  57.     
  58.     CopyCluts(hGD);
  59.     CalcFade(speed, &rgbs, fadeTo);
  60.  
  61.     if (fadeOut)
  62.         FadeOut(speed, rgbs, fadeTo);
  63.     else
  64.         FadeIn(speed, rgbs, fadeTo);
  65.  
  66.     RestoreClut();
  67.  
  68. // TEST - make sure we restore properly
  69.     if (!fadeOut) SetEntries(0,  gCtSize, (*gOrig)->ctTable);
  70.  
  71.     SetGDevice(oldDev);
  72.  
  73.     DisposeHandle(gTempH);
  74. }
  75. /*** fade_screen ***/
  76.  
  77.  
  78.  
  79. /*
  80. Rutiner in:
  81. FadeIn
  82. FadeInAll
  83. FadeInMain
  84. FadeOut
  85. FadeOutAll
  86. FadeOutMain
  87. */
  88.  
  89. /********************************** CopyCluts **********************************/
  90. static
  91. void CopyCluts(GDHandle hGD)
  92. {    
  93.     gFade = (*(*hGD)->gdPMap)->pmTable;
  94.     gTempH = (Handle) (*(*hGD)->gdPMap)->pmTable;
  95.     HandToHand(&gTempH);
  96.     gOrig = (CTabHandle) gTempH;
  97.     
  98.     HLock((Handle) gFade);
  99.     HLock((Handle) gOrig);
  100. }
  101.  
  102. /*********************************** CalcFade **********************************/
  103. static
  104. void CalcFade(short speed, FadeValues *rgbs, RGBColor fadeTo)
  105. {
  106.     short    i;
  107.     
  108.     for (i = 0; i <= gCtSize; i++)
  109.     {
  110.         rgbs->reds[i]   = ((long)(*gFade)->ctTable[i].rgb.red - (long)fadeTo.red)   / speed;
  111.         rgbs->greens[i] = ((long)(*gFade)->ctTable[i].rgb.green - (long)fadeTo.green) / speed;
  112.         rgbs->blues[i]  = ((long)(*gFade)->ctTable[i].rgb.blue - (long)fadeTo.blue)  / speed;
  113.     }
  114. }
  115.  
  116. /*********************************** FadeOut ***********************************/
  117. static
  118. void FadeOut(short speed, FadeValues rgbs, RGBColor fadeTo)
  119. {
  120.     short     i, j;
  121.     
  122.     gCtSeedSave = (*gFade)->ctSeed;        // Save!
  123.     
  124.     for (j = speed; j > 0; j--)
  125.     {
  126.         for (i = 0; i <= gCtSize; i++)
  127.         {
  128.             (*gFade)->ctTable[i].rgb.red   -= rgbs.reds[i];
  129.             (*gFade)->ctTable[i].rgb.green   -= rgbs.greens[i];
  130.             (*gFade)->ctTable[i].rgb.blue   -= rgbs.blues[i];
  131.         }
  132.         SetEntries(0,  gCtSize, (*gFade)->ctTable);
  133.     }
  134.     BlackOut(fadeTo);
  135. }
  136.  
  137. /************************************ FadeIn ***********************************/
  138. static
  139. void FadeIn(short speed, FadeValues rgbs, RGBColor fadeTo)
  140. {
  141.     short     i, j;
  142.     
  143.     BlackOut(fadeTo);
  144.  
  145.     for (j = 0; j < speed; j++)
  146.     {
  147.         for (i = 0; i <= gCtSize; i++)
  148.         {
  149.             (*gFade)->ctTable[i].rgb.red   += rgbs.reds[i];
  150.             (*gFade)->ctTable[i].rgb.green   += rgbs.greens[i];
  151.             (*gFade)->ctTable[i].rgb.blue   += rgbs.blues[i];
  152.         }
  153.         SetEntries(0, gCtSize, (*gFade)->ctTable);
  154.     }
  155.  
  156.     (*gFade)->ctSeed = gCtSeedSave;        // Restore!
  157. }
  158.  
  159. /*********************************** BlackOut **********************************/
  160. static
  161. void BlackOut(RGBColor fadeTo)
  162. {
  163.     short     i;
  164.     
  165.     for (i = 0; i <= gCtSize; i++)
  166.     {
  167.         (*gFade)->ctTable[i].rgb.red   = fadeTo.red;
  168.         (*gFade)->ctTable[i].rgb.green = fadeTo.green;
  169.         (*gFade)->ctTable[i].rgb.blue  = fadeTo.blue;
  170.     }
  171.     SetEntries(0, gCtSize, (*gFade)->ctTable);
  172. }
  173.  
  174. /********************************** RestoreClut ********************************/
  175. static
  176. void RestoreClut(void)
  177. {
  178.     short     i;
  179.     
  180.     for (i = 0; i <= gCtSize; i++)
  181.     {
  182.         (*gFade)->ctTable[i].rgb.red   = (*gOrig)->ctTable[i].rgb.red;
  183.         (*gFade)->ctTable[i].rgb.green = (*gOrig)->ctTable[i].rgb.green;
  184.         (*gFade)->ctTable[i].rgb.blue  = (*gOrig)->ctTable[i].rgb.blue;
  185.     }
  186.     (*gFade)->ctSeed = GetCTSeed();
  187.     MakeITable(nil, nil, 0);
  188.     
  189.     HUnlock((Handle) gFade);
  190.     HUnlock((Handle) gOrig);
  191. }
  192.